import string

import pandas as pd
import numpy as np

sh = pd.read_csv('../stockdata/sh.csv')
# print(sh.head(5))
# d = {'a':[1,2,3,4],'b':[5,6,7,8],'c':[5,9,10,11],'d':[6,7,8,9]}
# a = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list(string.ascii_lowercase[:3]), columns=list(string.ascii_uppercase[:4]))
# print(a)
# d = [[1, 2, 3, 4], [5, 6, 7, 8], [5, 9, 10, 11], [6, 7, 8, 9]]
# a = pd.DataFrame(d, columns=['a', 'b', 'c', 'd'])
# print(type(a.dtypes))
# print(a.index)
# print(a.columns)
# print(a.shape)
# print(a.ndim)
# print(a.values)

# print(sh.tail(5))
# print(sh.dtypes)
# print(sh.info())
# print(sh.describe())

# print(sh.head(5))
# print(sh.columns)
# 排序 ascentding 默认是升序
# print(a)
# print(a.sort_values(by='a'))
# # # 按多列排序
# print(a.sort_values(by=['a','b'], ascending=False))

# key变为列索引，不存在的key以NaN填充
# b = [{'a': 1, 'b': 2}, {'a': 2, 'b': 3, 'c': 7}, {'a': 4, 'b': 5}]
# c = pd.DataFrame(b)
# print(c)
#
# # key变为列索引，对应列表变为具体的值
# d = {'a': [1, 3, 4], 'b': [2, 4, 5]}  # a b必须拥有相等的长度，否则报错
# e = pd.DataFrame(d)
# print(e)


f = pd.DataFrame(np.arange(12).reshape((3, 4)), index=list(string.ascii_lowercase[:3]),
                 columns=list(string.ascii_uppercase[:4]))
print(f)
# loc方式取
# 取出一列，取出的结果是series
# print(f.loc[:, 'A'])
# print(type(f.loc[:, 'A']))
# # 取出多列，如A-C列，取出的结果是dataframe
# print(f.loc[:, 'A':'C'])
# # 取出某行某列，即对应的某一个位置的值，单独的值被取出
# print(f.loc['a', 'A'])
# # 取出两行两列，取出dataframe
# print(f.loc['a':'b', 'A':'B'])
# # 取出指定的某几列的数据，如A,C,取出dataframe
# print(f.loc[:, ['A', 'C']])
# # 取出指定的某几列某几行的数据,取出dataframe
# print(f.loc[['a', 'c'], ['A', 'C']])
# # 取出指定某一行的所有数据，结果是series
# print(f.loc['a', :])
# print(f.loc[['a'], :])
# # 取出指定某一行的某几列数据，结果是series
# print(f.loc['a', ['A', 'C']])
# # 需要取出的结果是dataframe
# print(f.loc[['a'], ['A', 'C']])

# 布尔索引
# print(f[f > 5])  # 小于5的被nan替换
# print(f['C'] > 5)
# print(f[f['C'] > 5])  # 只要C列数据大于5，那么这一行数据均返回
# print(f[(f['C'] > 5) & (f['A'] > 4)])  # 注意条件需要带上括号，否则报错
# print(f[(f['C'] > 5) | (f['A'] < 4)])  # 注意条件需要带上括号，否则报错

# pandas字符串的方法
# print(sh.head(5))
# print(sh['date'].str.len())
# print(sh.loc[:, 'date'].str.len())
# print(sh['date'].str.contains('2'))


# 缺失值处理
g = pd.DataFrame(np.arange(24).reshape((4, 6)), index=list(string.ascii_uppercase[:4]),
                 columns=list(string.ascii_uppercase[4:10]))
print(g)

# 将数据里的部分数据替换为nan和0
g.loc['A', 'G'] = 0
g.loc['C', 'H'] = np.nan
g.loc['B', 'H'] = np.nan
g.loc['D', 'F'] = np.nan
print(g)

# 判断数据是否为nan，得到布尔类型的数据
# print(pd.isnull(g))
# print(pd.notnull(g))

# 使用fillna方法进行填充，此方式有返回值，可通过参数设置没有返回值
# g.fillna(g.mean(), inplace=True)  # 替换为每列的均值
# g.fillna(g.median(), inplace=True)  # 替换为每列的中值
# g.fillna(0, inplace=True)  # 替换为0
# print(g)

# 计算某一列的平均值
# print(g['F'].mean())

# 只填充有NaN的某一列
# print(g['F'].fillna(g['F'].mean(), inplace=True))

# print(g.T)

print(sh.head(5))
print(sh.loc[:, 'date'].str.split('-'))  # 得到的结果是series类型，其中字符串被分割为列表形式
print(sh.loc[:, 'date'].str.split('-').dtypes)  # object类型
print(sh.loc[:, 'date'].str.split('-').tolist())  # 将原本得到的series，转换为列表嵌套列表
print(type(sh.loc[:, 'date'].str.split('-')))  # Series类型

print(g.to_dict(orient='records'))

